#!/usr/bin/env wish

set N_COLS 12
set N_LINS 8
set DIAM 50
set DIST 10
set visor [frame .v]
pack $visor -side top
set botoes [canvas .v.c -width [expr $N_COLS*($DIAM+$DIST)] -height [expr $N_LINS*($DIAM+$DIST)] -bg #333333]
pack $botoes -side left
set yMax [expr $N_LINS*($DIAM+$DIST)]
set amostra [canvas .v.a -width [expr $DIAM+$DIST] -height $yMax -bg black]
pack $amostra -side right

set controles [frame .ct]
pack $controles -side bottom
set ATRASO 100
set scAtraso [scale .ct.s -from 500 -to 1 -label Atraso -variable ATRASO -orient horizontal] 
pack $scAtraso -side left

# desenhar botoes e amostra
set x [expr $DIST/2+$DIAM/2]
$botoes create line $x 0 $x $yMax -width 15 -tag barra -fill #808080

for {set col 0} {$col < $N_COLS} {incr col} {
    set leds {}
    for {set lin 0} {$lin < $N_LINS} {incr lin} {
        lappend leds 0
    }
    set cols($col) $leds
    # puts $cols($col)
}
for {set col 0} {$col < $N_COLS} {incr col} {
    for {set lin 0} {$lin < $N_LINS} {incr lin} {
        set x [expr ($DIST/2)+$col*($DIAM+$DIST)]
        set y [expr ($DIST/2)+$lin*($DIAM+$DIST)]
        if {[lindex $cols($col) $lin]} {set cor red} else {set cor #660000}
        $botoes create oval $x $y [expr $x+$DIAM] [expr $y+$DIAM] -fill $cor \
            -width 2 -activeoutline yellow -tags pos$col@$lin
        if {$col==0} {
        $amostra create oval $x $y [expr $x+$DIAM] [expr $y+$DIAM] -fill $cor \
            -width 2 -activeoutline yellow -tags amostra$lin
        
        }
    }
}

$botoes bind all <Button-1> [list clique $botoes %x %y]

proc coord_pos {z} { 
    global DIST DIAM 
    expr ($z-$DIST/2)/($DIAM+$DIST) 
}

proc clique { tela x y } {
    global cols botoes
    set clicado [$tela find closest $x $y]
    set lin [coord_pos $y]
    set col [coord_pos $x]
    set estado [lindex $cols($col) $lin]
    if {$estado} {
        lset cols($col) $lin 0
        set cor #660000
    } else {
        lset cols($col) $lin 1
        set cor red
    }
    $botoes itemconfig current -fill $cor
}

set colunaAtiva 0
proc animar {} {
    global DIST DIAM N_COLS N_LINS ATRASO botoes colunaAtiva cols amostra
    incr colunaAtiva
    if {$colunaAtiva < $N_COLS} { 
        $botoes move barra [expr $DIAM+$DIST] 0
    } else {
        set colunaAtiva 0
        set yMax [expr $N_LINS*($DIAM+$DIST)]
        set x [expr $DIST/2+$DIAM/2]
        $botoes coords barra $x 0 $x $yMax
    }
    for {set lin 0} {$lin < $N_LINS} {incr lin} {
        set estado [lindex $cols($colunaAtiva) $lin]
        if {$estado} {
            set cor red
        } else {
            set cor #660000
        }
        $amostra itemconfig amostra$lin -fill $cor
    }
    after $ATRASO animar    
}

animar

set melhorias {
    - slider velocidade
    - botoes +/- colunas
    - botoes gravar/ler
    - drag para ligar/desligar botoes em série
    - botao limpar tudo
}

set ideia {
isto pode virar um jogo assim: o programa mostra 8 leds piscando num ciclo
e o jogador tem que programar o ciclo clicando nos botoes.
cada led que é programado corretamente muda de vermelho para verde
}
